package mwt.xml.xdbforms.schemalayer.types;

import mwt.xml.xdbforms.dblayer.metadata.impl.ColumnMetaData;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;

/**************************************************
 *
 * Definisce una classe astratta per tipo del documento xschema,
 * inserendo i campi e le operazione che ogni tipo deve avere.
 *
 * Per evitare di scrivere un singolo metodo
 * che crea dei frammenti xschema a seconda dei tipi
 * dei campi, la traduzione verrà fatta facendo delle
 * richieste anonime usando il pattern Chain of Responsability.
 * Lo scambio di messaggi verrà ridotto usando una gerarchia
 * tra i tipi, inoltre i tipi più comuni saranno messi nei primi posti
 * della catena. <br>
 * NOTA IMPORTANTE:
 * <b>
 * La gerachia dei tipi non rispetta quella
 * completa del database (MySQL) dovuti a limiti
 * di JDBC o pecurialità del database.
 * Ad esempio, VARCHAR e CHAR sono simili
 * differisco solo dal modo in cui mysql
 * memorizza i dati, per Java e XSchema saranno
 * dei tipi stringa limitati inferiormente
 * e superiormente. Lo stesso vale per i derivati di Blob,Text ossia
 * MEDIUMBLOB, LONGBLOB,TINYBLOB, LONGTEXT, MEDIUMTEXT e TINYTEXT
 * </b><br>
 *
 * SECONDA NOTA:
 * <b>
 * I tipi interi e derivati saranno trattati tutti con segno,
 * poichè non esiste un modo semplice per recuperare questi
 * tipi di metadati senza ancorarci troppo ad un specifico DBMS.
 * </b>
 *
 *
 */
public abstract class XmlTypes {

    /**
     * La variabile nextType viene usata per
     * propagare la richiesta lungo la catena
     */
    protected XmlTypes nextType = null;
    /**
     * Contiene il nome del tipo del campo:
     * CHAR, VARCHAR, ENUM, etc.
     */
    protected String typeName = null;
    /**
     * Contiene l'id del tipo come definito
     * nella classe java.sql.Types
     * @see java.sql.Types
     */
    protected int typeId = 0;
    /**
     * Mantiene il frammento xml
     * relativo al tipo di dato.
     * Per una specifica sulla costruzione del documento
     * si faccia riferimento alla documentazione.
     */
    protected DocumentFragment fragment = null;
    /**
     * Reference al documento corrente in costruzione
     */
    protected Document doc = null;


    /**
     * Prefisso del namespace
     */

    protected String prefix;


    /**
     * Setta il successore della catena
     * @param nextType successore
     */
    public void setNextType(XmlTypes nextType) {
        this.nextType = nextType;
    }

    /**
     * Costruttore
     * @param doc documento in costruzione
     */
    public XmlTypes(Document doc) {
        this.doc = doc;
    }

    /**
     *
     * @deprecated Costruttore inutilizzato, sarà rimosso
     * in una GA release
     * @param typeName
     */
    public XmlTypes(String typeName) {
        this.typeName = typeName;
    }

    /**
     * Costruttore di default
     */
    public XmlTypes() {
    }

    




    /**
     * Questo metodo costruisce il frammento o delega la
     * costruzione se il tipo richiesto non è gestito da esso
     * @param cmd oggetto con i metadati della colonna.
     * @see mwt.xml.xdbforms.dblayer.metadata.impl.ColumnMetaData
     * @return il frammento xschema per la definizione del tipo
     */
    public abstract DocumentFragment getSchemaType(ColumnMetaData cmd);


    /**
     * Ritorna un oggetto istanziato con il tipo specificato
     * @param baseType nome del tipo dell'oggetto da costruire
     * @param value valore del tipo
     * @return un oggetto del tipo richiesto propriamente istanziato
     */
    
    public abstract Object getXSchemaToJavaType(String baseType, String value);
    
}

